package com.hspedu.abstract_.template;

/**
 * 模版设计模式：
 * 在一个抽象类公开定义了执行的模版，其子类可以按需要重写方法实现，
 * 但是调用将以抽象类中的定义方式进行
 *
 * 优化TestTemplate的代码，将AA和BB中重复的代码提取出来，
 * 将AA和BB中独有的方法都重写父类中的一个抽象方法，利用动态绑定机制来调用AA或者BB中的方法
 */
public abstract class TestTemplateOverride {

    public abstract long job();
    public static void main(String[] args) {
        AA1 aa1 = new AA1();
        aa1.calculateTime();//动态绑定机制

        BB1 bb1 = new BB1();
        bb1.calculateTime();


    }
}

/**
 * 抽象模版「Abstract Template」：定义抽象操作，以便让子类实现。
 */
abstract class Template{
    public abstract void job();
    public void calculateTime(){
        long start = System.currentTimeMillis();//开始时间
        job();
        long end = System.currentTimeMillis();//结束时间
        System.out.println("执行时间" + (end - start));
    }

}

/**
 * 计算任务
 * 1+...+800000
 * 打印出这个计算的时间间隔
 *
 * 具体模版「Concrete Template」：实现父类所定义的一个或多个抽象方法，
 * 每一个具体的模版角色都可以给出这些抽象方法，使得顶级逻辑的实现各不相同
 */
class AA1 extends Template{
    public void job(){
        long num = 0;
        for (long i = 1; i <= 800000; i++) {
            num += 1;
        }
    }
}

/**
 * 计算任务
 * 1 * i * i+1 * ... * 80000
 * 打印出这个计算的时间间隔
 */
class BB1 extends Template{
    public void job(){
        long num = 1;
        for (long i = 1; i <= 80000; i++) {
            num = num * i;
        }
    }
}